﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using GestionCases;


namespace GestionEco
{
   public abstract class EtreVivant
    {
       public  Coordonnee position;

       private int vieMax;
       private int vieActuelle;
       private int soifMax;
       private int soifActuelle;
       private int coeffSoif;
       private int pointsActionActuels;
       private int age;
       private int majorite;
       private int nbTourReprod;
       private int ageMax;
       private string sexe;

       protected  Color couleur;
       protected Vector2 deplacement;
       protected Color[] data;
       protected Texture2D etreVivantTexture;


       #region assesseurs
       public int VieMax
       {
           get { return vieMax; }
           set { vieMax = value; }
       }

       public int VieActuelle
       {
           get { return vieActuelle; }
           set { vieActuelle = value; }
       }

       public int SoifMax
       {
           get { return soifMax; }
           set { soifMax = value; }
       }

       public int SoifActuelle
       {
           get { return soifActuelle; }
           set { soifActuelle = value; }
       }

       public int PointsActionActuels
       {
           get { return pointsActionActuels; }
           set { pointsActionActuels = value; }
       }

       public int Age
       {
           get { return age; }
           set { age = value; }
       }

       public int Majorite
       {
           get { return majorite; }
           set { majorite = value; }
       }

       public string Sexe
       {
           get { return sexe; }
           set { sexe = value; }
       }

       public int AgeMax
       {
           get { return ageMax; }
           set { ageMax = value; }
       }

       public int CoeffSoif
       {
           get { return coeffSoif; }
           set { coeffSoif = value; }
       }

       public int NbTourReprod
       {
           get { return nbTourReprod; }
           set { nbTourReprod = value; }
       }
       #endregion

       public EtreVivant(int uneVieMax, int uneSoifMax, int unCoeffSoif, int desPointsActionActuels, int unAgeMax, int uneMajorite, int unNbTourReprod, string unSexe, Color uneCouleur)

       {
           Random rnd = new Random();
           this.couleur = uneCouleur;
           this.position = new Coordonnee();
           this.deplacement = new Vector2();
           this.deplacement = Vector2.One;
           this.data= new Color[5 * 5];
           for (int i = 0; i < data.Length; ++i) data[i] = uneCouleur;

           
           this.VieMax = (uneVieMax * rnd.Next(1, 7)) * 10;
           this.VieActuelle = VieMax;
           this.SoifMax = uneSoifMax * rnd.Next(1, 7);
           this.SoifActuelle = SoifMax;
           this.coeffSoif = unCoeffSoif;
           this.PointsActionActuels = 6;
           this.age = 0;
           this.sexe = unSexe;
           this.ageMax = unAgeMax + rnd.Next(-5, 5);
           this.nbTourReprod = unNbTourReprod;
       }

       public virtual void afficher()
       {
           Console.WriteLine(this.etreVivantTexture.Width);
           
       }

       public Color getCouleur()
       {

           return this.couleur;

       }
       public Texture2D getEtreVivantTexture()
       {

           return this.etreVivantTexture;

       }
       public Color[] getdata()
       {

           return this.data;

       }

       public void setEtreVivantTexture(Texture2D uneTexture )
       {

           this.etreVivantTexture = uneTexture;

       }

       public Vector2 getDeplacement()
       {
           return this.deplacement;
       }

       public void setDeplacement(Vector2 unVec)
       {
           this.deplacement = unVec;
       }

       public virtual void seDeplacer()
       {

       }

       public virtual void seRegenerer()
       { 
       
       }

       public virtual void vieillir()
       {
           // on ajoute 1 a l'age de l'animal
           this.age += 1;
       }

       public virtual void seNourrir()
       {
           if (this.PointsActionActuels >= 4)
           {
               this.PointsActionActuels -= 4;
           }
           else
           {
               Console.WriteLine("Plus de points d'action pour manger");
           }
       }

       public virtual void boire(Case uneCase)
       {
           if (this.PointsActionActuels >= 2)
           {
               this.PointsActionActuels -= 2;
                          
               //si plus d'eau que soifmax
               if (uneCase.QteEauActuelle >= this.SoifMax)
               {
                   this.SoifActuelle = this.SoifMax;
               }
               else
               {
                   this.SoifActuelle += uneCase.QteEauActuelle;
                   if (this.SoifActuelle > this.SoifMax)
                   {
                       this.SoifActuelle = this.SoifMax;
                   }
               }
               //Qte d'eau restante dans la case
               uneCase.QteEauActuelle = (this.SoifMax - this.SoifActuelle) - uneCase.QteEauActuelle;
           }
           else
           {
               Console.WriteLine("Plus de points d'action pour boire");
           }
       }

       public virtual void seReproduire()
       {
           if (this.PointsActionActuels >= 6)
           {
               this.PointsActionActuels -= 6;
           }
           else
           {
               Console.WriteLine("Plus de points d'action pour se reproduire");
           }

       }

    }
}
